<?php

/**
 * 初始化 Session
 */
if (session_status() === PHP_SESSION_NONE) {
    ini_set('session.use_only_cookies', 1);  // 禁止通过 URL 传递 session id
    ini_set('session.use_strict_mode', 1);   // 拒绝不存在的 session id，防止 session fixation

    // 如果是 HTTPS
    if ($_SERVER['HTTPS'] === 'on' || $_SERVER['SERVER_PORT'] == 443) {
        ini_set('session.cookie_secure', '1');
    }

    // 设置 Cookie 参数
    session_set_cookie_params([
        'lifetime'        => 0,               // 会话 cookie，浏览器关闭后失效
        'path'            => '/',             // 整个站点可用
        'httponly'        => true,            // JS 无法访问，防止 XSS 窃取
        'samesite'        => 'Strict',        // 防止 CSRF（根据需要改为 Lax/None）
    ]);

    session_start();

    // 设置会话有效期（30分钟）
    $max_lifetime = 1800;
    if (!isset($_SESSION['CREATED'])) {
        $_SESSION['CREATED'] = time();
    } elseif (time() - $_SESSION['CREATED'] > $max_lifetime) {
        // 超时处理：销毁并重启
        session_unset();
        session_destroy();
        session_start();
        $_SESSION['CREATED'] = time();
    }

    // 绑定客户端环境，防止会话劫持
    $user_agent = $_SERVER['HTTP_USER_AGENT'] ?? '';
    if (!isset($_SESSION['USER_AGENT'])) {
        $_SESSION['USER_AGENT'] = $user_agent;
    } elseif ($_SESSION['USER_AGENT'] !== $user_agent) {
        session_unset();
        session_destroy();
        session_start();
        $_SESSION['USER_AGENT'] = $user_agent;
    }
}


/**
 * 定义一些框架常量
 */
define('APP_PATH', str_replace('\\', '/', dirname(__DIR__) . '/'));
define('CORE_PATH', APP_PATH . 'core/');
define('BASE_URL', '');

/**
 * 获取清理后的 URL 以及 URL 分段信息
 * @return  array{assumed_url: string, segments: string[]} 返回包含假设 URL 和分段数组
 */
function get_segments(): array
{
    // 去掉协议并去除 BASE_URL 尾部斜杠
    $base = rtrim(str_replace('://', '', BASE_URL), '/');
    // 计算需要丢弃的 URL 前缀段数
    $discard = max(0, substr_count($base, '/'));

    // 判断当前请求使用的协议
    $scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') ? 'https' : 'http';
    // 拼接完整 URL
    $assumed = $scheme . '://' . ($_SERVER['HTTP_HOST'] ?? 'localhost') . ($_SERVER['REQUEST_URI'] ?? '/');
    // 尝试进行自定义路由映射
    $assumed = attempt_custom_routing($assumed);

    // 清理 URL 并分割成各段
    $clean = trim(str_replace('://', '', $assumed), '/');
    $segments = explode('/', $clean);

    // 返回最终 URL 及有效分段
    return [
        'assumed_url' => $assumed,
        'segments' => array_slice($segments, $discard)
    ];
}

/**
 * 尝试进行自定义路由匹配（支持缓存）
 * @param string $url 原始 URL
 * @return string 路由处理后的 URL
 */
function attempt_custom_routing(string $url): string
{
    static $routes = null;

    // 初始化自定义路由规则
    if ($routes === null && defined('CUSTOM_ROUTES')) {
        $routes = [];
        foreach (CUSTOM_ROUTES as $pattern => $dest) {
            // 将路由模式转换为正则
            $regex = '#^' . str_replace(
                ['/', '(:num)', '(:any)'],
                ['\/', '(\d+)', '([^\/]+)'],
                $pattern
            ) . '$#';
            $routes[] = [$regex, $dest];
        }
    }

    // 获取 URL 的路径部分
    $path = ltrim(parse_url($url, PHP_URL_PATH) ?: '/', '/');

    // 遍历路由规则进行匹配
    foreach ($routes ?? [] as [$regex, $dest]) {
        if (preg_match($regex, $path, $matches)) {
            // 替换目标路由中的占位符
            for ($i = 1, $count = count($matches); $i < $count; $i++) {
                $dest = str_replace('$' . $i, $matches[$i], $dest);
            }
            return rtrim(BASE_URL . $dest, '/');
        }
    }

    // 未匹配任何自定义路由，则返回原始 URL
    return $url;
}

/* --------------------------------------------------------------
 * 定义最终常量
 * -------------------------------------------------------------- */
$segments = get_segments();
define('SEGMENTS', $segments['segments']);
define('ASSUMED_URL', $segments['assumed_url']);
